#include "gpio.h"

// LED_RUN
#define LED_RUN_GPIO_PORT                   (GPIOA)
#define LED_RUN_GPIO_CLK                    (RCC_APB2Periph_GPIOA)
#define LED_RUN_GPIO_PIN                    (GPIO_Pin_8)
#define LED_RUN_GPIO_TOGGLE                 (LED_RUN_GPIO_PORT->BSRR = ((LED_RUN_GPIO_PORT->ODR & LED_RUN_GPIO_PIN) << 16) | (~LED_RUN_GPIO_PORT->ODR & LED_RUN_GPIO_PIN))
#define LED_RUN_GPIO_SET                    (LED_RUN_GPIO_PORT->BSRR = (uint32_t)LED_RUN_GPIO_PIN)
#define LED_RUN_GPIO_RESET                  (LED_RUN_GPIO_PORT->BSRR = (uint32_t)LED_RUN_GPIO_PIN<<16)
#define LED_RUN_GPIO_READ                   ((LED_RUN_GPIO_PORT->IDR & LED_RUN_GPIO_PIN) != 0)
// TEST_IN
#define TEST_IN_GPIO_PORT                   (GPIOA)
#define TEST_IN_GPIO_CLK                    (RCC_APB2Periph_GPIOA)
#define TEST_IN_GPIO_PIN                    (GPIO_Pin_2)
#define TEST_IN_GPIO_TOGGLE                 (TEST_IN_GPIO_PORT->BSRR = ((TEST_IN_GPIO_PORT->ODR & TEST_IN_GPIO_PIN) << 16) | (~TEST_IN_GPIO_PORT->ODR & TEST_IN_GPIO_PIN))
#define TEST_IN_GPIO_SET                    (TEST_IN_GPIO_PORT->BSRR = (uint32_t)TEST_IN_GPIO_PIN)
#define TEST_IN_GPIO_RESET                  (TEST_IN_GPIO_PORT->BSRR = (uint32_t)TEST_IN_GPIO_PIN<<16)
#define TEST_IN_GPIO_READ                   ((TEST_IN_GPIO_PORT->IDR & TEST_IN_GPIO_PIN) != 0)

/**
  * @brief  gpio初始化配置
  * @param  None
  * @retval None
  */
void gpio_init_config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /*开启LED相关的GPIO外设时钟*/
    RCC_APB2PeriphClockCmd(LED_RUN_GPIO_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = LED_RUN_GPIO_PIN;
    /*设置引脚模式为*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    /*设置引脚速率*/   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    /*调用库函数，初始化GPIO*/
    GPIO_Init(LED_RUN_GPIO_PORT, &GPIO_InitStructure);
    /*关闭*/
    LED_RUN_GPIO_SET;
    
    GPIO_InitStructure.GPIO_Pin = TEST_IN_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(TEST_IN_GPIO_PORT, &GPIO_InitStructure);
}

/**
  * @brief  IO置高
  * @param  None
  * @retval None
  */
void gpio_set(uint8_t gpiox)
{
    switch(gpiox)
    {
        case LED_RUN: LED_RUN_GPIO_SET; break;
        case TEST_IN: TEST_IN_GPIO_SET; break;
    }
}

/**
  * @brief  IO置低
  * @param  None
  * @retval None
  */
void gpio_reset(uint8_t gpiox)
{
    switch(gpiox)
    {
        case LED_RUN: LED_RUN_GPIO_RESET; break;
        case TEST_IN: TEST_IN_GPIO_RESET; break;
    }
}

/**
  * @brief  IO翻转
  * @param  None
  * @retval None
  */
void gpio_toggle(uint8_t gpiox)
{
    switch(gpiox)
    {
        case LED_RUN: LED_RUN_GPIO_TOGGLE; break;
        case TEST_IN: TEST_IN_GPIO_TOGGLE; break;
    }
}

/**
  * @brief  IO读取
  * @param  None
  * @retval None
  */
uint8_t gpio_read(uint8_t gpiox)
{
    uint8_t temp = 0;
    
    switch(gpiox)
    {
        case LED_RUN: temp = LED_RUN_GPIO_READ; break;
        case TEST_IN: temp = TEST_IN_GPIO_READ; break;
    }
    
    return temp;
}
